home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / eshot / 3 / eshot.c next >
C/C++ Source or Header  |  2000-07-07  |  3KB  |  162 lines

  1. /* eshot.c */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <conio.h>
  6. #include <sys/iocs.h>
  7. #include "XSP2lib.H"
  8.  
  9. #define PCG_MAX    32        /* パターンデータの個数 */
  10.  
  11. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  12. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  13.  
  14. static unsigned short pal_dat[16][15];    /* パレットデータ */
  15.  
  16.  
  17. #define ESHOT_MAX    200    /* 敵弾最大数 */
  18.  
  19. signed short eshot_x[ESHOT_MAX];    /* 敵弾のX座標 */
  20. signed short eshot_y[ESHOT_MAX];    /*  〃 Y座標 */
  21. unsigned char eshot_type[ESHOT_MAX];    /*  〃 種類(=0 なら未使用) */
  22.  
  23. /* 関数プロトタイプ宣言 */
  24. void EshotFree (unsigned short);
  25.  
  26.  
  27.  
  28. /* ゲーム開始時に呼ばれる */
  29. void EshotInit (void)
  30. {
  31.     int i;
  32.  
  33.     for (i = 0; i < ESHOT_MAX; i++)
  34.         eshot_type[i] = 0;    /* 全部未使用に */
  35. }
  36.  
  37.  
  38.  
  39. /* 敵弾出現時に呼ばれる */
  40. /* 引き数 : 種類, X座標, Y座標 */
  41. void EshotAlloc (unsigned short type, signed short x, signed short y)
  42. {
  43.     int i;
  44.  
  45.     for (i = 0; i < ESHOT_MAX; i++) {
  46.         /* 未使用のワークを見つける */
  47.         if (eshot_type[i] == 0) {
  48.             /* 未使用のワークを見つけた */
  49.             eshot_x[i] = x;
  50.             eshot_y[i] = y;
  51.             eshot_type[i] = type;
  52.             break;    /* for ループを抜ける */
  53.         }
  54.     }
  55. }
  56.  
  57.  
  58.  
  59. /* 垂直同期ごとに呼ばれる */
  60. void EshotMove (void)
  61. {
  62.     int i;
  63.  
  64.     for (i = 0; i < ESHOT_MAX; i++) {
  65.         /* そのワークは使用中か? */
  66.         if (eshot_type[i] != 0) {
  67.             /* 使用中のワークを見つけた */
  68.             eshot_x[i] += 4;    /* 4ドット右に移動 */
  69.             eshot_y[i] += 4;    /* 4ドット下に移動 */
  70.  
  71.             /* 画面外にでたら敵弾を消去(未使用)に */
  72.             if ((eshot_x[i] > 256) || (eshot_y[i] > 256)) {
  73.                 EshotFree (i);
  74.             } else {
  75.                 /* 座標(eshot_x,eshot_y), スプライト No.1, パレット3, 優先順位 $3f */
  76.                 xsp_set (eshot_x[i], eshot_y[i], 1, 0x033f);
  77.             }
  78.         }
  79.     }
  80. }
  81.  
  82.  
  83.  
  84. /* 敵弾消去時に呼ばれる */
  85. void EshotFree (unsigned short i)
  86. {
  87.     eshot_type[i] = 0;    /* 未使用に */
  88. }
  89.  
  90.  
  91.  
  92. int main (int argc, char *argv[])
  93. {
  94.     FILE *fp;
  95.     int i, j;
  96.     int game_over = 0;
  97.  
  98.     if (argc != 1) {
  99.         printf (
  100.                    "敵弾テストその3 ESHOT.X\n"
  101.                    "        programmed by Mitsuky <FreeSoftware>\n"
  102.                    "複数の弾を配列を使って処理してみます\n"
  103.             );
  104.         exit (-1);
  105.     }
  106.     _iocs_crtmod (10);    /* 256x256ドット グラフィック画面 256色 2画面 */
  107.     _iocs_sp_init ();    /* スプライトの初期化 */
  108.     _iocs_sp_on ();
  109.  
  110.     /* pcg_dat にパターンデータを読み込む */
  111.     fp = fopen ("ESHOT.SP", "rb");
  112.     fread (pcg_dat, sizeof (char), PCG_MAX * 128, fp);
  113.     fclose (fp);
  114.  
  115.     /* pal_buf に一旦パレットデータを読み込む */
  116.     fp = fopen ("ESHOT.PAL", "rb");
  117.     fread (pal_dat, sizeof (unsigned short), 16 * 15, fp);
  118.     fclose (fp);
  119.     /* パレットデータを定義 */
  120.     /* (1パレットブロック=16色) × (15ブロックぶん) 定義する */
  121.     {
  122.         unsigned short *p = (unsigned short *) pal_dat;
  123.         for (i = 1; i < 15; i++)
  124.             for (j = 0; j < 16; j++)
  125.                 _iocs_spalet (0x80000000 | j, i, *p++);
  126.     }
  127.  
  128.     xsp_on ();
  129.     xsp_mode (3);
  130.     /* パターンデータを定義 */
  131.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  132.  
  133.  
  134.     printf ("ジョイスティックの\n"
  135.         " [B] ボタンを押すと弾を撃ちます\n"
  136.         " [A] ボタンを押すと終了します\n");
  137.  
  138.  
  139.     EshotInit ();
  140.  
  141.     do {
  142.         xsp_vsync (0);    /* 垂直同期待ち */
  143.         j = _iocs_joyget (0);    /* ジョイスティック0番 */
  144.  
  145.         /* [A] ボタンが押されたか? */
  146.         if ((j & 0b00100000) == 0)
  147.             game_over = !0;        /* ゲームオーバーに */
  148.  
  149.         /* [B] ボタンが押されたか? */
  150.         if ((j & 0b1000000) == 0)
  151.             EshotAlloc (1, 32, 32);        /* 種類1 の敵弾を座標(32,32)に発生 */
  152.  
  153.         EshotMove ();
  154.         xsp_out ();    /* 表示 */
  155.     } while (!game_over);
  156.  
  157.     xsp_off ();
  158.  
  159.     _iocs_crtmod (16);
  160.     return (0);
  161. }
  162.